#ifndef __IMU_H_
#define __IMU_H_

#include "board.h"

extern enum {
    x = 0,
    y,
    z,
} Axis;

extern enum {
    yaw = 0,
    pitch,
    roll
} Euler;

typedef struct
{
    fp32 GyroOffset[3];  // 陀螺仪零飘校准参数
    fp32 RawGyro[3];     // 已经去除零飘、温漂
    fp32 RawAccel[3];    // 原始加速度计
    fp32 FiltAccel[3];   // 滤波后的加速度计
    fp32 Quat[4];        // 四元数
    fp32 AngleOffset[3]; // 欧拉角归零误差
    fp32 EulerAngle[3];  // 经过归零的欧拉角
    fp32 Temp;           // IMU温度
    fp32 SetYaw;         // 设定的偏航角
    uint8 Preheat;       // 陀螺仪预热开关
    uint8 CaliGyro;      // 陀螺仪校准开关
    uint8 CaliZero;      // 陀螺仪归零开关
} IMU_type;

extern IMU_type IMU;

void IMU_Init(void);
void IMU_Reset(void);
void IMU_Preheat(void);
void IMU_Heating(void);
void IMU_Process(void);

void IMU_SetYaw(fp32 _Angle);
fp32 IMU_CalcYawRef(void);

void IMU_GyroOffsetCalc(void);

#endif // !__IMU_H_